class Solution {
    int dx[4] = {0, 0, 1, -1};
    int dy[4] = {1, -1, 0, 0};
    bool vis[51][51];
    int m, n;

public:
    int maxAreaOfIsland(vector<vector<int>>& grid) {
        m = grid.size(), n = grid[0].size();

        int ret = 0;
        for(int i = 0; i < m; i++)
        {
            for(int j = 0; j < n; j++)
            {
                // 遍历岛屿块
                // 岛屿块要为 1，且没有被遍历过，即 vis[i][j] == false
                if(grid[i][j] == 1 && !vis[i][j])
                {
                    ret = max(ret, bfs(grid, i, j));
                }
            }
        }

        return ret;
    }

    int bfs(vector<vector<int>>& grid, int i, int j)
    {
        int cnt = 0;    // 统计岛屿的面积
        queue<pair<int, int>> q;
        q.push({i, j});
        cnt++;
        vis[i][j] = true;   // 说明这块岛屿已经遍历过

        while(q.size())
        {
            auto [a, b] = q.front();
            q.pop();
            for(int k = 0; k < 4; k++)
            {
                int x = a + dx[k], y = b + dy[k];   // 找四个方向的坐标
                if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 && !vis[x][y])
                {
                    q.push({x, y});
                    cnt++;
                    vis[x][y] = true;   // 说明这块岛屿已经遍历过
                }
            }
        }
        
        return cnt;
    }
};